library(ggplot2)
library(TSA)
library(plotly)
data("oil.price")

Creating a time series without seasons trend

oil = as.vector(oil.price)
oil.data = data.frame(price = oil, time = 1:length(oil))
ggplot(data=oil.data, aes(x=time, y =price)) + geom_point() + geom_line()

lm1 = lm(data = oil.data, price~time)
lm1.data = data.frame(dif = diff(resid(lm1)), time = 1:length(diff(resid(lm1))))
ggplot(data = lm1.data, aes(x = time, y = dif)) + geom_point() + geom_line()

par(mfrow = c(1, 2)); acf(diff(resid(lm1))); pacf(diff(resid(lm1)));

t = armasubsets(diff(lm1$residuals), 12, 12)
plot(t)

fit1 = arima(oil, order = c(10, 1, 5),  fixed = c(0,0,0,NA,0,0,0,0,0,NA,NA,0,0,0,NA))
some AR parameters were fixed: setting transform.pars = FALSE
par(mfrow = c(1, 2));plot(fit1, n.ahead = 20);plot(oil)

test = predict(fit1, n.ahead = 10)
x = length(fitted(fit1)):(length(fitted(fit1))+9)
y = predict(fit1, n.ahead = 10)$pred
upperbound = y + predict(fit1, n.ahead = 10)$se
lowerbound = y - predict(fit1, n.ahead = 10)$se
fit1.data = data.frame(x,y,upperbound,lowerbound)
p = ggplot() + geom_line(data=oil.data, aes(x=time, y =price)) + geom_smooth(data = fit1.data, aes(x = x, y = y,ymax=upperbound, ymin=lowerbound), color = "RED",stat='identity') 
ggplotly(p)
par(mfrow = c(1, 2), pty = 's');acf(fit1$residuals); pacf(fit1$residuals);

plot.ts(fit1$residuals)

tsdiag(fit1)

Anomaly Detection

fitted = fitted(fit1)
upper <- fitted + 2.5*sqrt(fit1$sigma2)
lower <- fitted - 2.5*sqrt(fit1$sigma2)
plot(oil, type="n", ylim=range(lower,upper))
polygon(c(time(oil),rev(time(oil))), c(upper,rev(lower)), 
   col=rgb(0,0,0.6,0.2), border=FALSE)
lines(oil)
#lines(fitted,col='red')
out <- (oil < lower | oil > upper)
points(time(oil)[out], oil[out], pch=19)

From the graph above there seems to be 7 anomalies and trying to research some of the anomalies gave me no results. I would have expected the anomolies to be at places like the spike around 50 but it seems like those are not considered anomalies.

LS0tCnRpdGxlOiAiT2lsIFByaWNlIEFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiAiVmljIENoYW4iCi0tLQoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShUU0EpCmxpYnJhcnkocGxvdGx5KQpkYXRhKCJvaWwucHJpY2UiKQpgYGAKCgpDcmVhdGluZyBhIHRpbWUgc2VyaWVzIHdpdGhvdXQgc2Vhc29ucyB0cmVuZApgYGB7cn0Kb2lsID0gYXMudmVjdG9yKG9pbC5wcmljZSkKCm9pbC5kYXRhID0gZGF0YS5mcmFtZShwcmljZSA9IG9pbCwgdGltZSA9IDE6bGVuZ3RoKG9pbCkpCmdncGxvdChkYXRhPW9pbC5kYXRhLCBhZXMoeD10aW1lLCB5ID1wcmljZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9saW5lKCkKYGBgCmBgYHtyfQpsbTEgPSBsbShkYXRhID0gb2lsLmRhdGEsIHByaWNlfnRpbWUpCgpsbTEuZGF0YSA9IGRhdGEuZnJhbWUoZGlmID0gZGlmZihyZXNpZChsbTEpKSwgdGltZSA9IDE6bGVuZ3RoKGRpZmYocmVzaWQobG0xKSkpKQoKZ2dwbG90KGRhdGEgPSBsbTEuZGF0YSwgYWVzKHggPSB0aW1lLCB5ID0gZGlmKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKQpgYGAKCgpgYGB7cn0KcGFyKG1mcm93ID0gYygxLCAyKSk7IGFjZihkaWZmKHJlc2lkKGxtMSkpKTsgcGFjZihkaWZmKHJlc2lkKGxtMSkpKTsKYGBgCgpgYGB7cn0KdCA9IGFybWFzdWJzZXRzKGRpZmYobG0xJHJlc2lkdWFscyksIDEyLCAxMikKcGxvdCh0KQpgYGAKCmBgYHtyfQpmaXQxID0gYXJpbWEob2lsLCBvcmRlciA9IGMoMTAsIDEsIDUpLCAgZml4ZWQgPSBjKDAsMCwwLE5BLDAsMCwwLDAsMCxOQSxOQSwwLDAsMCxOQSkpCnBhcihtZnJvdyA9IGMoMSwgMikpO3Bsb3QoZml0MSwgbi5haGVhZCA9IDIwKTtwbG90KG9pbCkKCnRlc3QgPSBwcmVkaWN0KGZpdDEsIG4uYWhlYWQgPSAxMCkKCnggPSBsZW5ndGgoZml0dGVkKGZpdDEpKToobGVuZ3RoKGZpdHRlZChmaXQxKSkrOSkKeSA9IHByZWRpY3QoZml0MSwgbi5haGVhZCA9IDEwKSRwcmVkCnVwcGVyYm91bmQgPSB5ICsgcHJlZGljdChmaXQxLCBuLmFoZWFkID0gMTApJHNlCmxvd2VyYm91bmQgPSB5IC0gcHJlZGljdChmaXQxLCBuLmFoZWFkID0gMTApJHNlCgpmaXQxLmRhdGEgPSBkYXRhLmZyYW1lKHgseSx1cHBlcmJvdW5kLGxvd2VyYm91bmQpCgpwID0gZ2dwbG90KCkgKyBnZW9tX2xpbmUoZGF0YT1vaWwuZGF0YSwgYWVzKHg9dGltZSwgeSA9cHJpY2UpKSArIGdlb21fc21vb3RoKGRhdGEgPSBmaXQxLmRhdGEsIGFlcyh4ID0geCwgeSA9IHkseW1heD11cHBlcmJvdW5kLCB5bWluPWxvd2VyYm91bmQpLCBjb2xvciA9ICJSRUQiLHN0YXQ9J2lkZW50aXR5JykgCgpnZ3Bsb3RseShwKQpgYGAKCmBgYHtyfQpwYXIobWZyb3cgPSBjKDEsIDIpLCBwdHkgPSAncycpO2FjZihmaXQxJHJlc2lkdWFscyk7IHBhY2YoZml0MSRyZXNpZHVhbHMpOwpwbG90LnRzKGZpdDEkcmVzaWR1YWxzKQp0c2RpYWcoZml0MSkKYGBgCgoKQW5vbWFseSBEZXRlY3Rpb24KYGBge3J9CmZpdHRlZCA9IGZpdHRlZChmaXQxKQoKdXBwZXIgPC0gZml0dGVkICsgMi41KnNxcnQoZml0MSRzaWdtYTIpCmxvd2VyIDwtIGZpdHRlZCAtIDIuNSpzcXJ0KGZpdDEkc2lnbWEyKQoKcGxvdChvaWwsIHR5cGU9Im4iLCB5bGltPXJhbmdlKGxvd2VyLHVwcGVyKSkKcG9seWdvbihjKHRpbWUob2lsKSxyZXYodGltZShvaWwpKSksIGModXBwZXIscmV2KGxvd2VyKSksIAogICBjb2w9cmdiKDAsMCwwLjYsMC4yKSwgYm9yZGVyPUZBTFNFKQpsaW5lcyhvaWwpCiNsaW5lcyhmaXR0ZWQsY29sPSdyZWQnKQpvdXQgPC0gKG9pbCA8IGxvd2VyIHwgb2lsID4gdXBwZXIpCnBvaW50cyh0aW1lKG9pbClbb3V0XSwgb2lsW291dF0sIHBjaD0xOSkKYGBgCkZyb20gdGhlIGdyYXBoIGFib3ZlIHRoZXJlIHNlZW1zIHRvIGJlIDcgYW5vbWFsaWVzIGFuZCB0cnlpbmcgdG8gcmVzZWFyY2ggc29tZSBvZiB0aGUgYW5vbWFsaWVzIGdhdmUgbWUgbm8gcmVzdWx0cy4gSSB3b3VsZCBoYXZlIGV4cGVjdGVkIHRoZSBhbm9tb2xpZXMgdG8gYmUgYXQgcGxhY2VzIGxpa2UgdGhlIHNwaWtlIGFyb3VuZCA1MCBidXQgaXQgc2VlbXMgbGlrZSB0aG9zZSBhcmUgbm90IGNvbnNpZGVyZWQgYW5vbWFsaWVzLiA=